home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / cexpress / system / xchgdata.asm < prev   
Encoding:
Assembly Source File  |  1989-05-03  |  1.5 KB  |  54 lines

  1. ;void  exchange_data(seg1, ofs1, seg2, ofs2, number_bytes);
  2. ;  unsigned short  seg1, ofs1, seg2, ofs2, number_bytes;
  3.  
  4.     EXTRN  _memory_model:byte
  5.  
  6. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  7.     ASSUME CS:_TEXT
  8.     PUBLIC _exchange_data
  9. _exchange_data proc near
  10.     push di            ;
  11.     push si            ;
  12.     push bp            ;save BP
  13.     mov  bp,sp        ;set stack frame
  14.     cmp  _memory_model,0    ;near or far?
  15.     jle  begin        ;jump if near
  16.     inc  bp            ;else add 2 to BP
  17.     inc  bp            ;
  18. begin:    push ds            ;save Turbo's data seg
  19.     mov  ax,[bp+4]        ;get segment of area 1
  20.     mov  ds,ax        ;place in DS
  21.     mov  si,[bp+6]        ;get offset of area 1
  22.     mov  ax,[bp+8]        ;get segment of area 2
  23.     mov  es,ax        ;place in ES
  24.     mov  di,[bp+10]        ;get offset of area 2
  25.     mov  cx,[bp+12]        ;number bytes to exchange
  26.     mov  dx,cx        ;keep copy in DX
  27.     shr  cx,1        ;copy 2 bytes at a time
  28.     cld            ;direction flag forward
  29.     jcxz L2            ;jump if 1 or 0 bytes
  30. L1:    mov  bx,es:[di]        ;get byte from area 2
  31.     mov  ax,[si]        ;get byte from area 1
  32.     mov  [si],bx        ;set byte in area 1
  33.     stosw            ;set byte in area 2
  34.     inc  si            ;forward ptr
  35.     inc  si            ;again
  36.     loop L1            ;loop till finished
  37. L2:    test dx,1        ;is Bytes an odd number?
  38.     jz   L3            ;quit if not
  39.     mov  bl,es:[di]        ;get last byte of area 2
  40.     mov  al,[si]        ;get last byte of area 1
  41.     mov  es:[di],al        ;place one final byte
  42.     mov  [si],bl        ;place other final byte
  43. L3:    pop  ds            ;restore registers
  44.     pop  bp            ;
  45.     pop  si            ;
  46.     pop  di            ;
  47.     cmp  _memory_model,0    ;quit
  48.     jle  Quit        ;
  49.     db   0CBh        ;RET far
  50. Quit:    ret            ;RET near
  51. _exchange_data endp
  52. _TEXT    ENDS
  53.     END
  54.